/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.resource;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Rappresenta i dati di un carrello.
 * 
 * @author Nicola Salmaso
 * @version 1.00
 */
public class Carrello {

	/**
	 * ArrayList di prodotti nel carrello
	 */
	private final ArrayList<Prodotto> carrello;
	
	/**
	 * HashMap con chiave = codice prodotto, valore = quantità prodotto nel carrello
	 */
	private final HashMap<Integer,Integer> qta;
	
	/**
	 * email dell'utente della sessione attuale
	 */
	private final String email;
	
	
	
	/**
	 * Crea un nuovo carrello assocciato ad una sessione (identificata dalla email)
	 * 
	 * @param email
	 * 			email dell'utente della sessione attuale
	 */
	public Carrello(String email) {
		this.email=email;
		carrello = new ArrayList<Prodotto>();
		qta = new HashMap<Integer,Integer>();
	}

	/**
	 * Restituisce il nome della categoria
	 * 
	 * @return email dell'utente della sessione attuale
	 */
	public String getEmail(){
		return email;
	}
	
	/**
	 * Restituisce la descrizione della categoria
	 * 
	 * @return carrello di prodotti
	 */
	public ArrayList<Prodotto> getCarrello(){
		return carrello;
	}
	
	/**
	 * Aggiunge un prodotto al carrello
	 * 
	 * @param prodotto
	 * 		prodotto da aggiungere
	 * @return esito dell'aggiunta al carrello
	 */
	public boolean add(Prodotto prodotto)
	{
		int codiceProdotto = prodotto.getCodice();
		// se il prodotto è già presente ne incremento la quantità, altrimenti lo aggiungo con quantità ad 1
		Integer q = qta.containsKey(codiceProdotto) ? qta.get(codiceProdotto)+1 : 1;
		qta.put(codiceProdotto,q);
		//se il prodotto non era già presente nel carrello lo aggiungo
		if( q.equals(1) ) carrello.add(prodotto);
		return true;
	}
	

	/**
	 * Riduce di una quantità un prodotto presente nel carrello,
	 * se è presente un solo articolo si occupa di rimuovere completamente il prodotto dal carrello
	 * 
	 * @param codiceProdotto
	 * 	codice del prodotto da rimuovere
	 * @return esito della rimozione dal carrello 
	 */
	public boolean remove(Integer codiceProdotto)
	{
		Integer q;
		if( qta.containsKey(codiceProdotto) )
		{
			q = qta.get(codiceProdotto)-1;
			qta.put(codiceProdotto, q);
			if( q.equals(0) ) return delete(codiceProdotto);
		}
		return true;
	}
	
	/**
	 * Rimuove completamente un prodotto dal carrello
	 * @param codiceProdotto
	 *  codice del prodotto da rimuovere
	 * @return esito dell'aggiunta al carrello
	 */
	private boolean delete(Integer codiceProdotto)
	{
		qta.remove(codiceProdotto);
	    return carrello.remove(carrello.indexOf(getProdotto(codiceProdotto))) == null? false : true;
	}
	
	/**
	 * Restituisce un prodotto del carrello
	 * @param codice
	 *  codice del prodotto
	 * @return prodotto associato al codice prodotto
	 */
	public Prodotto getProdotto(Integer codice)
	{
		for( Prodotto prodotto : carrello)
			if( codice.equals(prodotto.getCodice())) return prodotto;
		return null;
	}
	
	/**
	 * Restituisce la quantità di un prodotto presente nel carrello
	 * @param codice
	 *  codice del prodotto
	 * @return quantità di prodotto prensente nel carrello, 0 se assente
	 */
	public Integer getQta(Integer codice)
	{
		Integer toReturn = qta.get(codice);
		return toReturn==null? 0 : toReturn;
	}
	/**
	 * Restituisce una mappa che associa il codice di un prodotto alla quantità di tale prodotto nel carrello
	 * @return hash map <key=codice prodotto,value=quantità prodotto>
	 */
	public HashMap<Integer,Integer> getProdotti()
	{
		return qta;
	}
	/**
	 * Restituisce il numero di prodotti distinti nel carrello
	 * @return numero di prodotto distinti del carrello
	 */
	public int size()
	{
		return carrello.size();
	}
	/**
	 * Restituisce il numero totale di prodotti nel carrello
	 * @return numero totale di prodotti nel carrello
	 */
	public int totalSize()
	{
		int total = 0;
		for( Integer codice : qta.keySet()) total += qta.get(codice);
		return total;
	}
	
	

}
